---
title: 'Permacomputing Praxis: Website Monitoring'
url: /2025/04/permacomputing-praxis-website-monitoring/
draft: false
categories:
- de
date: 2025-04-16T15:14:41+0200
tags:
- Permacomputing
- HTTP
- Monitor
- curl
- cron
- ssh
- konvivial
- DIY
type: post
author: Marcus Rohrmoser
---

Wer eine Webseite hat, mag Überraschungen der Art 'Server ist aus' oder
'Zertifikat ist abgelaufen' nicht sonderlich, vor allem wenn's länger nicht
bemerkt wird. Und das zu vermeiden, besucht man die Webseite routinemäßig. Das
kann man selbst machen, einen Cloud-Dienst verwenden oder eine Software dafür
installieren und benutzen.

Das angenehme an Cloud Diensten ist auch hier, es ist zunächst wenig
Arbeit und ggf. sogar recht billig. Für einige meiner Webseiten, z.B.
https://jhl.qdrei.info, geht das aber nicht, da sie aus Gründen Nachts
aus sein sollen. Das mag mein Lieblings-Cloud-Monitor nicht. Außerdem
sind Cloud-Services mit ihren intransparenten und tiefen Tech-Stacks nie
Permacomputing[^perma]-verträglich.

Also was tun?

Der Wunsch scheint ganz einfach: 3x am Tag prüfen, ob die Webseite läuft
und ggf. eine Email schicken. Aber er ist ungewöhnlich, drum gibt's das nicht
von der Stange.

Genügt dafür, was ich bereits habe (Shared Hosting mit ssh Zugang), so daß
ich nichts Neues kaufen oder installieren muß? Und ich will keine Doktorarbeit
daraus machen.

1. per `curl` Webseite abrufen
2. wenn das gut geht, eine Meldung in's Protokoll und fertig
3. ansonsten ebenfalls Meldung in's Protokoll und eine Email, auch per `curl`, an mich,
4. und das per cron 3x täglich.

```sh
$ ssh shell.example.org crontab -l
 30 7,14,21 * * * sh .local/bin/http-monitor.sh https://www.example.org/seppo.cgi
```

Damit das Protokoll nicht volläuft, wird's nach 20 Einträgen beiseite geschoben
(alte überschrieben) und ein neues angefangen. Statt `logrotate`.

Um nachzuschauen, was bisher los war, genügt

```sh
$ ssh shell.example.org cat .local/log/http-monitor.log
2025-04-07 07:30:01+02:00 ✅ ok   HEAD https://www.example.org/seppo.cgi
2025-04-07 14:30:01+02:00 ✅ ok   HEAD https://www.example.org/seppo.cgi
```

Das komplette Script (Quelltext[^htmo]), zu dem noch separate Einstellungen wie
Serveradresse und Email-Zugangsdaten dazukommen, ist:

```sh
#!/bin/sh
# https://mro.name/http-monitor
[ "$1" = "" ] && {
  cat <<EOF
Simple website monitor. Adjust notification email server endpoint and mail_rcpt
in
$0.conf
and credentials in
$0.cred

Call by cron like e.g.

2 * * * * sh .local/bin/http-monitor.sh https://www.example.org/seppo.cgi
EOF
  exit
}

# some wicked utf-8 emojis
readonly ok="✅"
# readonly warn="⚠️"
readonly fail="❌"

. "$0".conf
readonly smtp mail_rcpt log

# rotate log
[ $(($(wc -l < "$log"))) -gt 20 ] && mv "$log" "$log".0 && touch "$log"

dat="$(date --rfc-3339=second)" ; readonly dat
curl \
  --fail \
  --head \
  --location \
  --max-time 4.5 \
  --output /dev/null \
  --silent \
  "$1" \
&& echo "$dat ok   $ok HEAD $1" >> "$log" && exit 0
echo "$dat fail $fail HEAD $1" >> "$log"

file="$(mktemp -p "$HOME/.local/tmp" -t "$(basename "$0")".tmp.XXXXXX)"
userinfo="$(head -n 1 "${0}.cred")"
username="$(echo "$userinfo" | cut -d : -f 1)"
readonly userinfo username file

cat > "$file" <<EOF
Content-Type: text/plain; charset=utf-8
From: http-monitor <$username>
Date: $(LC_TIME="C" date +'%a, %d %b %Y %T %z')
Subject: $fail [DOWN] $1

Aua
EOF

curl \
  --crlf \
  --mail-rcpt "$mail_rcpt" \
  --max-time 4.5 \
  --silent \
  --upload-file "$file" \
  --user "$userinfo" \
  "$smtp"
rm "$file"
```

# Fazit

Oft genügen einfache, bereits existierende Werkzeuge. POSIX[^posix] hat vieles,
man muß es allerdings wissen.

Für diesen http-monitor[^htmo] genügen 60 Zeilen `sh`-Script, `curl`, `cron` und
`ssh`. Dabei geht's nicht um Code-Golf, sondern um eine verständliche Lösung,
die sich daran orientiert, was gebraucht wird und nicht, was gerade für den
Lebenslauf angesagt ist.

Was nicht installiert wird, muß auch nicht aktualisiert werden, bringt keine
Bugs mit.

So können *Tools for Conviviality*[^con73] in der IT aussehen &mdash; Dinge,
die gebaut werden, um sie zu benutzen und nicht um sie zu verkaufen oder
Abhängigkeiten zu erzeugen.

[^perma]: https://permacomputing.net/Principles/
[^posix]: https://de.wikipedia.org/wiki/POSIX
[^htmo]:  Quelltext https://mro.name/http-monitor
[^con73]: https://archive.org/details/illich-conviviality
